package com.xian.d6_collection_update_delete;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 目标:研究集合遍历并删除元素可能出现的:并发修改异常问题。
 *
 * 问题引出
 * 当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。
 *
 * 哪些遍历存在问题?
 * 迭代器遍历集合且直接用集合删除元素的时候可能出现。
 * 增强for循环遍历集合且直接用集合删除元素的时候可能出现。
 *
 * 哪种遍历且删除元素不出问题
 * 迭代器遍历集合但是用迭代器自己的删除方法操作可以解决。使用for循环遍历并删除元素不会存在这个问题。
 */
public class Test {
    public static void main(String[] args) {
        //1、这准备数据
        List<String> list = new ArrayList<>();
        list.add("小贤");
        list.add("Java");
        list.add("Java");
        list.add("Python");
        list.add("哈哈哈");
        list.add("666");
        System.out.println(list);


        //需求:删除全部的Java信息。

        //a、迭代器遍历删除
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String ele = it.next();
            if ("Java".equals(ele)) {
                //list.remove(ele);  //报错  ConcurrentModificationException  并发修改异常
                it.remove();  //删除迭代器所在位置的元素值
            }
        }
        System.out.println(list);


        //b、foreach遍历删除(会出现问题,这种无法解决的，foreach不能边遍历边除,会出bug)
//        for (String s : list) {
//            if ("Java".equals(s)) {
//                //list.remove(s);   ConcurrentModificationException  并发修改异常
//            }
//        }


        //c、lambda表达式 (会出现问题,这种无法解决的，lambda,会出bug)
//        list.forEach(s -> {
//            if ("Java".equals(s)) {
//                //list.remove(s);   ConcurrentModificationException  并发修改异常
//            }
//        });

        //d、for循环 (边遍历边删除集合没毛病，但是必须从后面开始遍历删除才不会出现漏掉应该删除的元素)
        for (int i = list.size() - 1; i >= 0; i--) {
            String el = list.get(i);
            if ("Java".equals(el)) {
                list.remove(el);
            }
        }
        System.out.println(list);
    }
}
